/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package colordrips;


import java.util.ArrayList;
import java.util.Random;
import javax.swing.ImageIcon;
import javax.swing.JLabel;

/**
 * Classe que representa um bloco do jogo. Extende JLabel.
 * @author SimaoItalo
 */
public class Block extends JLabel {
    
    /**
     * 
     */
    public static ArrayList<Listener> listeners = new ArrayList<Listener>();
    private boolean empty;
    private String color;
    private Random random;
    private int iPosition;
    private int jPosition;

    /**
     * Construtor do bloco, já setando as cores com o método chooseColor.
     * @param iPosition - Representa a posição i do bloco na matriz.
     * @param jPosition - Representa a posição j do blcoo na matriz.
     * @param isborder - indica se o bloco é uma borda.
     */
    public Block(int iPosition, int jPosition, boolean isborder) {
        this.iPosition = iPosition;
        this.jPosition = jPosition;
        if(!isborder){
          chooseColor();
          this.empty = false;
        } else {
            this.color = "border";
            this.empty = true;
        }
    }
    
    /**
     * Escolhe a cor do bloco aleatoriamente.
     */
    private void chooseColor(){
        random = new Random();
        int colorNumber = random.nextInt(4);
        setToolTipText(iPosition+", "+jPosition);
        switch(colorNumber){
            case 0:
                this.color = "blue";
                setIcon(new ImageIcon(getClass().getResource("/assets/circle_blue48.png")));
                break;
            case 1:
                this.color = "red";
                setIcon(new ImageIcon(getClass().getResource("/assets/circle_red48.png")));
                break;
            case 2:
                this.color = "green";
                setIcon(new ImageIcon(getClass().getResource("/assets/circle_green48.png")));
                break;
            case 3:
                this.color = "orange";
                setIcon(new ImageIcon(getClass().getResource("/assets/circle_orange48.png")));
                break;
        } 
                    
    }
    
    /**
     * Método que traz a cor do bloco.
     * @return - uma string com a cor atual do bloco.
     */
    public String getColor(){
        return this.color;
    }
    
    /**
     * Seta a cor do bloco.
     * @param color - uma string para ser setada como cor atual do bloco.
     */
    public void setColor(String color){
        this.color = color;
    }

    /**
     * Verifica se o bloco está "vazio".
     * @return - uma boolean, true se o bloco estiver vazio, false se não estiver.
     */
    public boolean isEmpty() {
        return empty;
    }

    /**
     * Método que traz a posição i do bloco na matriz.
     * @return - um inteiro com a posição i do bloco.
     */
    public int getiPosition() {
        return iPosition;
    }

    /**
     * Método que traz a posição j do bloco na matriz.
     * @return - um inteiro com a posição j do bloco.
     */
    public int getjPosition() {
        return jPosition;
    }

    /**
     * Seta a posição i do bloco em relação a matriz.
     * @param iPosition - inteiro que será setado como posição i do bloco.
     */
    public void setiPosition(int iPosition) {
        this.iPosition = iPosition;
        setToolTipText(iPosition+", "+jPosition);
    }

    /**
     * Seta a posição j do bloco em relação a matriz.
     * @param jPosition - inteiro que será setado como posi~çao j do bloco.
     */
    public void setjPosition(int jPosition) {
        this.jPosition = jPosition;
        setToolTipText(iPosition+", "+jPosition);
    }
    
    /**
     * Verifica se o bloco selecionado tem a mesma cor desse bloco.
     * @param selectedBlock - Bloco selecionado no campo de jogo.
     * @return - TRUE se forem da mesma cor, FALSE se não forem.
     */
    public boolean hasSameColor(Block selectedBlock){
        if (this.isEmpty()){
            return false;
        } else if(this.color.equalsIgnoreCase(selectedBlock.color)) {
            return true;
        } else {
            return false;
        }
    }
    
    /**
     * Limpa o bloco, setando ele como vazio e sua imagem.
     * Sempre que u bloco é limpado, é chamado o método "executeAction",
     * que executa o método redesign.
     */
    public void clearBlock(){
        this.empty = true;
        setImage("");
        //explosionEffect();
        listeners.get(0).executeAction();
    }
    
    /**
     * Seta a imagem do bloco.
     * @param url - diretório da imagem no projeto.
     */
    public void setImage(String url){
        setIcon(new ImageIcon(getClass().getResource(url)));
    }
    
    /**
     * Faz o efeito de explosão nos blocos.
     */
    public void explosionEffect(){
        setImage("/assets/explosion.png");
        
        //setImage("");
    }
    
}
